package Kernel;

import java.util.ArrayList;
import Exceptions.TrajetNotContainedException;

public class Client {
	private int id;
	private String nom;
	private String prenom;
	private ArrayList<Trajet> mesTrajets;
	private Serveur serveur;

	/* #### Constructeurs #### */

	/**
	 * Constructeur par défaut de la classe Client, remplie avec des valeurs
	 * null.
	 */
	public Client() {
		this.id = -1;
		this.nom = "user";
		this.prenom = "user";
		this.mesTrajets = null;
		this.serveur = new Serveur();
	}

	/**
	 * Constructeur paramètré de la classe Client.
	 * 
	 * @param id
	 *            est l'identifiant (unique) du client
	 * @param nom
	 *            est le nom du client
	 * @param prenom
	 *            est le prenom du client
	 */

	public Client(int id, String nom, String prenom, Serveur serv) {
		this.id = id;
		this.nom = nom;
		this.prenom = prenom;
		this.mesTrajets = new ArrayList<Trajet>();
		this.serveur = serv;
	}

	/* #### Methodes definies manuellement #### */

	/**
	 * Ajouter un trajet au "panier" du client
	 * 
	 * @param trajet
	 *            est le trajet à ajouter
	 */
	public void addNewTrajet(Trajet trajet) {
		this.mesTrajets.add(trajet);
	}

	/**
	 * Supprimer un trajet du panier Client
	 * 
	 * @param trajet
	 *            est le trajet à supprimer
	 * @throws TrajetNotContainedException
	 *             est levée si le trajet n'est pas contenu.
	 */
	public void deleteTrajet(Trajet trajet) throws TrajetNotContainedException {
		if (this.mesTrajets.contains((Trajet) trajet)) {
			this.mesTrajets.remove((Trajet) trajet);
		}
	}

	/* |||| Méthodes de recherche |||| */

	/**
	 * Pour supprimer un billet de la liste
	 * 
	 * @param billet
	 * @return true si suppression effectuée, false sinon
	 */
	public boolean supprimerBillet(Billet billet) {
		return this.serveur.supprimerBillet(billet);
	}

	/**
	 * Ajouter un Billet à la liste
	 * 
	 * @param billet
	 *            billet à ajouter
	 */

	protected void ajouterBillet(Billet billet) {
		this.serveur.ajouterBillet(billet);
	}

	/**
	 * Formater l'objet pour la sauvegarde
	 * 
	 * @return les informations sur l'objet
	 * 
	 */
	public String print() {
		return this.nom + ";" + this.prenom;
	}

	/* #### Methodes surchargees #### */

	/* #### Mutateurs #### */

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}

	public String getPrenom() {
		return prenom;
	}

	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}

	public Serveur getServeur() {
		return serveur;
	}

}
